var zTreeObj;

/**
 * 全局变量
 */
var log, className = "dark";


// zTree 的参数配置，深入使用请参考 API 文档（setting 配置详解）

// 设置
var setting = {
	// 异步请求
	async : {
		enable : true,// 开启异步请求加载数据
		url : listurl, //请求的url
		autoParam : [ "id" ],
		// 异步获取的数据过滤函数
		dataFilter : function(treeId, parentNode, responseData) {
			if (responseData.code) {
				var pdata = responseData.data.list;
				for ( var i in pdata) {
					if (pdata[i]['codeorurl'] != "") {
						pdata[i]['name'] = pdata[i]['name'] + '-'
								+ pdata[i]['codeorurl'];
					}
					// pdata[i]['open'] = true;
					// 调整为父节点
					pdata[i]['isParent'] = true;
				}
				//返回我们拼接好的数据
				return pdata;
			} else {
				alert(responseData.msg);
			}
		}
	},

	view : {
		// 用于当鼠标移动到节点上时，显示用户自定义控件，显示隐藏状态同 zTree 内部的编辑、删除按钮
		// 请务必与 setting.view.removeHoverDom 同时使用；属于高级应用，使用时请确保对 zTree 比较了解。
		// 默认值：null
		addHoverDom : addHoverDom,

		// 用于当鼠标移出节点时，隐藏用户自定义控件，显示隐藏状态同 zTree 内部的编辑、删除按钮
		// 请务必与 addHoverDom 同时使用；属于高级应用，使用时请确保对 zTree 比较了解。
		// 默认值：null
		removeHoverDom : removeHoverDom,

		// 设置是否允许同时选中多个节点。
		// 默认值: true
		selectedMulti : false,

	},
	edit : {

		// 设置 zTree 是否处于编辑状态
		// 请在初始化之前设置，初始化后需要改变编辑状态请使用 zTreeObj.setEditable() 方法
		// 默认值: false
		enable : true,

		// 节点编辑名称 input 初次显示时,设置 txt 内容是否为全选状态。 [setting.edit.enable = true 时生效]
		// 默认值: false
		editNameSelectAll : false,

		// 设置是否显示删除按钮。[setting.edit.enable = true 时生效]
		// 当点击某节点的删除按钮时：
		// 1、首先触发 setting.callback.beforeRemove 回调函数，用户可判定是否进行删除操作。
		// 2、如果未设置 beforeRemove 或 beforeRemove 返回 true，则删除节点并触发
		// setting.callback.onRemove 回调函数。
		// 默认值：true
		showRemoveBtn : showRemoveBtn,

		// 设置是否显示编辑名称按钮。[setting.edit.enable = true 时生效]
		// 当点击某节点的编辑名称按钮时：
		// 1、进入分类编辑名称状态。
		// 2、编辑名称完毕（Input 失去焦点 或 按下 Enter 键），会触发 setting.callback.beforeRename
		// 回调函数，用户可根据自己的规则判定是否允许修改名称。
		// 3、如果 beforeRename 返回 false，则继续保持编辑名称状态，直到名称符合规则位置 （按下 ESC
		// 键可取消编辑名称状态，恢复原名称）。
		// 4、如果未设置 beforeRename 或 beforeRename 返回 true，则结束节点编辑名称状态，更新分类名称，并触发
		// setting.callback.onRename 回调函数。
		// 默认值：true
		showRenameBtn : showRenameBtn
	},

	data : {
		simpleData : {
			// 确定 zTree 初始化时的节点数据、异步加载时的节点数据、或 addNodes 方法中输入的 newNodes
			// 数据是否采用简单数据模式 (Array)
			// 不需要用户再把数据库中取出的 List 强行转换为复杂的 JSON 嵌套格式
			// 默认值：false
			enable : true,
			idKey : "id",
			pIdKey : "pid",
		},

	},

	callback : { // 回调
		// 用于捕获节点被拖拽之前的事件回调函数，并且根据返回值确定是否允许开启拖拽操作默认值：null
		beforeDrag : beforeDrag,

		// 用于捕获节点编辑按钮的 click 事件，并且根据返回值确定是否允许进入名称编辑状态
		// 此事件回调函数最主要是用于捕获编辑按钮的点击事件，然后触发自定义的编辑界面操作。
		// 默认值：null
		beforeEditName : beforeEditName,

		// 用于捕获节点被删除之前的事件回调函数，并且根据返回值确定是否允许删除操作
		// 默认值：null
		beforeRemove : beforeRemove,

		// 用于捕获节点编辑名称结束（Input 失去焦点 或 按下 Enter
		// 键）之后，更新分类名称数据之前的事件回调函数，并且根据返回值确定是否允许更改名称的操作
		// 节点进入编辑名称状态后，按 ESC 键可以放弃当前修改，恢复原名称，取消编辑名称状态
		// 从 v3.5.13 开始，取消编辑状态也会触发此回调，根据 isCancel 参数判断
		// 默认值：null
		beforeRename : beforeRename,

		// 用于捕获删除节点之后的事件回调函数。
		// 如果用户设置了 beforeRemove 回调函数，并返回 false，将无法触发 onRemove 事件回调函数。
		// 默认值：null
		onRemove : onRemove,

		// 用于捕获节点编辑名称结束之后的事件回调函数。
		// 1、节点进入编辑名称状态，并且修改分类名称后触发此回调函数。如果用户设置了 beforeRename 回调函数，并返回
		// false，将无法触发 onRename 事件回调函数。
		// 2、如果通过直接修改 treeNode 的数据，并且利用 updateNode 方法更新，是不会触发此回调函数的。
		// 3、从 v3.5.13 开始，取消编辑状态也会触发此回调，根据 isCancel 参数判断
		// 默认值：null
		onRename : onRename,

		// 用于捕获 勾选 或 取消勾选 之前的事件回调函数，并且根据返回值确定是否允许 勾选 或 取消勾选
		beforeCheck : beforeCheck,

		// 用于捕获 checkbox / radio 被勾选 或 取消勾选的事件回调函数
		// 如果设置了 setting.callback.beforeCheck 方法，且返回 false，将无法触发 onCheck 事件回调函数。
		onCheck : onCheck,
	},
	// 选择设置
	check : {
		enable : false, // 设置 zTree 的节点上是否显示 checkbox / radio
		autoCheckTrigger : true, // 是否触发回调函数
	}
};

// 拖拽
function beforeDrag(treeId, treeNodes) {
	return false;
}

// 编辑之前
function beforeEditName(treeId, treeNode) {
	className = (className === "dark" ? "" : "dark");
	var zTree = $.fn.zTree.getZTreeObj("ztree");
	zTree.selectNode(treeNode);
	// return confirm("进入分类 -- " + treeNode.name + " 的编辑状态吗？");
	return true;
}

// 删除之前
function beforeRemove(treeId, treeNode) {
	var zTree = $.fn.zTree.getZTreeObj("ztree");
	// console.log(treeNode);
	var st = false;
	if (confirm("确认删除 权限 -- " + treeNode.name + " 吗？该分类下有子权限会一并删除，请谨慎选择")) {
            $.ajax({
                type : 'GET',
                url : delurl,
                data : {
                    "id" : treeNode.id
                },
                success : function(data, s, x) {
                    if (data['code']) {
                        st = true;
                    } else {
                        alert('删除失败');
                        st = false;
                    }
                },
                dataType : 'json',
                async : false, // 同步，会锁住浏览器(重点)
            });
		return st;
	} else {
		return false;
	}

}

// 删除节点
function onRemove(e, treeId, treeNode) {
	// console.log(e);
	// console.log(treeId);
	// console.log(treeNode);
}

// 该方法用于修改节点名称
// 用于捕获节点编辑名称结束（Input 失去焦点 或 按下 Enter
// 键）之后，更新节点名称数据之前的事件回调函数，并且根据返回值确定是否允许更改名称的操作
function beforeRename(treeId, treeNode, newName, isCancel) {
	className = (className === "dark" ? "" : "dark");
	if (newName.length == 0) {
		alert("名称不能为空.");
		var id = treeNode.tId;
		$("#" + id + "_input").val(treeNode.name);
		var zTree = $.fn.zTree.getZTreeObj("tree");
		setTimeout(function() {
			zTree.editName(treeNode)
		}, 10);
		return false;
	} else { // ajax 修改名称
		var nameArray = newName.split('-');
		// console.log(nameArray);
		$.post(updateurl, {
			"id" : parseInt(treeNode.id),
			"name" : nameArray[0],
			"codeorurl" : nameArray.length == 2 ? nameArray[1] : ""
		}, function(data, s, x) {
			if (!data.code) {
				alert('修改失败');
				var id = treeNode.tId;
				$("#" + id + "_input").val(treeNode.name);
				return false;
			} else {
				return true;
			}
		});
	}
}

// 编辑名称之后回调
function onRename(e, treeId, treeNode, isCancel) {

}

// 显示删除按钮
// 显示删除按钮
function showRemoveBtn(treeId, treeNode) {
	// return !treeNode.isFirstNode;
	return ptypedelete;
}

// 显示编辑按钮
function showRenameBtn(treeId, treeNode) {
	// return !treeNode.isLastNode;
	return ptypeupdate;
}

// 添加计数变量
var newCount = 1;

/**
 * 鼠标移入显示操作控件 鼠标移入回调的方法，常用于显示自定义控件，比如添加
 * 
 * @param treeId
 * @param treeNode
 * @returns
 */
function addHoverDom(treeId, treeNode) {
	
	var sObj = $("#" + treeNode.tId + "_span");
	if (treeNode.editNameFlag || $("#addBtn_" + treeNode.tId).length > 0) {
		return;
	}

	// 判断是否有新增权限
	if (ptypecreate) {
		// 构造添加的节点
		var addStr = "<span class='button add' id='addBtn_" + treeNode.tId
				+ "' title='添加权限' onfocus='this.blur();'></span>";
		// 就是把添加按钮的html 代码片段加入到树插件中
		sObj.after(addStr);

		var btn = $("#addBtn_" + treeNode.tId);
		if (btn) {
			// 绑定一个单击事件
			btn.bind("click", function() { // 添加节点
				// ajax 添加元素
				$.post(addurl, {
					"name" : "新名称" + newCount,
					"pid" : parseInt(treeNode.id),
					"path" : treeNode.path + treeNode.id + '-'
				}, function(data, s, x) {
					if (data['code']) {
						console.log(data)
						var zTree = $.fn.zTree.getZTreeObj("ztree");
						// 添加的数据
						var addtype = {
							"id" : data.data.p.id, // id
							"pid" : parseInt(treeNode.id),
							"name" : "新名称" + (newCount++),
							"path" : treeNode.path + treeNode.id + "-",
						};
						zTree.addNodes(treeNode, addtype);
					} else {
						alert("添加失败");
						// myMessage("添加失败", "alert alert-danger");
					}
				});

				return false;
			});
		}
	}

};

// 鼠标移出隐藏操作控件
function removeHoverDom(treeId, treeNode) {
	$("#addBtn_" + treeNode.tId).unbind().remove();
};

// 用于捕获 勾选 或 取消勾选 之前的事件回调函数，并且根据返回值确定是否允许 勾选 或 取消勾选
// 在onCheck 之前执行
function beforeCheck(treeId, treeNode) {

}

// 用于捕获 checkbox / radio 被勾选 或 取消勾选的事件回调函数
// 如果设置了 setting.callback.beforeCheck 方法，且返回 false，将无法触发 onCheck 事件回调函数。
function onCheck(event, treeId, treeNode) {
	// console.log(treeId);
	// console.log(treeNode);
}

// zTree 的数据属性，深入使用请参考 API 文档（zTreeNode 节点数据详解）

$(function() {

	// 获取所有数据
	$.post(listurl, {
		pid : 0
	}, function(data, s, x) {
		if (data['code']) {
			var pdata = data['data'].list;
			
			for ( var i in pdata) {
				if (pdata[i]['codeorurl'] != "") {
					pdata[i]['name'] = pdata[i]['name'] + '-'
							+ pdata[i]['codeorurl'];
				}

				// pdata[i]['open'] = true;
				// 调整为父节点
				pdata[i]['isParent'] = true;
			}
			
			console.log(pdata);

			// 使用树插件 第一个参数是通过jq来选择对象(ul标签)
			zTreeObj = $.fn.zTree.init($("#ztree"), setting, pdata);
		}

	})
	
	//创建一级分类权限
	$("#create_permissions").click(function(){
		// ajax 添加元素
		$.post(addurl, {
			"name" : "新名称" + newCount,
			"pid" : 0,
			"path" : '0-'
		}, function(data, s, x) {
			if (data['code']) {
				//页面刷新
				window.location.reload();
			} else {
				alert("添加失败");
				// myMessage("添加失败", "alert alert-danger");
			}
		});
	})

});